home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Celestin Apprentice 5
/
Apprentice-Release5.iso
/
Source Code
/
By the Book
/
Mac C Primer V2
/
3.3 - MDEF Rewrite
/
MDEF.c
next >
Wrap
C/C++ Source or Header
|
1993-04-01
|
5KB
|
219 lines
/********************************************************/
/* */
/* MDEF Code from Chapter Three of */
/* */
/* The Macintosh Programming Primer, Volume II, */
/* Second Edition */
/* */
/* Copyright 1993, Dave Mark */
/* */
/* This program demonstrates specific Mac programming */
/* techniques. */
/* */
/********************************************************/
#define kTopMargin 1
#define kLeftMargin 2
void DoSizeMessage( MenuHandle menu, Rect *menuRectPtr );
void DoDrawMessage( MenuHandle menu, Rect *menuRectPtr );
void DoChooseMessage( MenuHandle menu, Rect *menuRectPtr,
Point hitPt, short *whichItemPtr );
void InvertItem( short itemNumber, short itemHeight, Rect *menuRectPtr );
void DrawCenteredPict( PicHandle pic, Rect *rectPtr );
void CalcitemHeightAndWidth( short basePICTid, short numPICTs,
short *widthPtr, short *heightPtr );
void GetNumPICTs( MenuHandle menu, short *baseIDPtr,
short *numPICTsPtr );
/*********************************** main */
pascal void main( short message,
MenuHandle menu,
Rect *menuRectPtr,
Point hitPt,
short *whichItemPtr )
{
switch( message )
{
case mDrawMsg:
DoDrawMessage( menu, menuRectPtr );
break;
case mChooseMsg:
DoChooseMessage( menu, menuRectPtr, hitPt, whichItemPtr );
break;
case mSizeMsg:
DoSizeMessage( menu, menuRectPtr );
break;
}
}
/*********************************** DoSizeMessage */
void DoSizeMessage( MenuHandle menu,
Rect *menuRectPtr )
{
short basePICTid, numPICTs, maxPICTWidth, maxPICTHeight;
GetNumPICTs( menu, &basePICTid, &numPICTs );
CalcitemHeightAndWidth( basePICTid, numPICTs, &maxPICTWidth, &maxPICTHeight );
(**menu).menuWidth = maxPICTWidth + 2 * kLeftMargin;
(**menu).menuHeight = (maxPICTHeight + kTopMargin * 2) * numPICTs;
}
/*********************************** DoDrawMessage */
void DoDrawMessage( MenuHandle menu,
Rect *menuRectPtr )
{
short basePICTid, numPICTs, maxPICTWidth, maxPICTHeight, itemHeight, i;
Rect r, tempRect;
PicHandle pic;
GetNumPICTs( menu, &basePICTid, &numPICTs );
CalcitemHeightAndWidth( basePICTid, numPICTs, &maxPICTWidth, &maxPICTHeight );
itemHeight = maxPICTHeight + kTopMargin * 2;
r.top = menuRectPtr->top + kTopMargin;
r.left = menuRectPtr->left + kLeftMargin;
r.bottom = r.top + maxPICTHeight;
r.right = r.left + maxPICTWidth;
for ( i=0; i<numPICTs; i++ )
{
pic = GetPicture( basePICTid + i );
DrawCenteredPict( pic, &r );
OffsetRect( &r, 0, itemHeight );
}
}
/*********************************** DoChooseMessage */
void DoChooseMessage( MenuHandle menu,
Rect *menuRectPtr,
Point hitPt,
short *whichItemPtr )
{
short basePICTid, selectedItem, numPICTs, maxPICTWidth, maxPICTHeight, itemHeight;
Rect r;
GetNumPICTs( menu, &basePICTid, &numPICTs );
CalcitemHeightAndWidth( basePICTid, numPICTs, &maxPICTWidth, &maxPICTHeight );
itemHeight = (2 * kTopMargin) + maxPICTHeight;
if ( PtInRect( hitPt, menuRectPtr ) )
{
selectedItem = ( (hitPt.v - menuRectPtr->top) / itemHeight ) + 1;
if ( ( *whichItemPtr > 0 ) && ( *whichItemPtr != selectedItem ) )
{
InvertItem( *whichItemPtr, itemHeight, menuRectPtr );
}
if ( *whichItemPtr != selectedItem )
{
*whichItemPtr = selectedItem;
InvertItem( *whichItemPtr, itemHeight, menuRectPtr );
}
}
else if ( *whichItemPtr > 0 )
{
InvertItem( *whichItemPtr, itemHeight, menuRectPtr );
*whichItemPtr = 0;
}
}
/*********************************** InvertItem */
void InvertItem( short itemNumber,
short itemHeight,
Rect *menuRectPtr )
{
Rect r;
r = *menuRectPtr;
r.top += ( (itemNumber-1) * itemHeight );
r.bottom = r.top + itemHeight;
InvertRect( &r );
}
/*********************************** DrawCenteredPict */
void DrawCenteredPict( PicHandle pic,
Rect *rectPtr )
{
Rect pictRect;
pictRect = (**pic).picFrame;
OffsetRect( &pictRect, rectPtr->left - pictRect.left,
rectPtr->top - pictRect.top);
OffsetRect( &pictRect,(rectPtr->right - pictRect.right)/2,
(rectPtr->bottom - pictRect.bottom)/2);
DrawPicture( pic, &pictRect );
}
/*********************************** CalcitemHeightAndWidth */
void CalcitemHeightAndWidth( short basePICTid,
short numPICTs,
short *widthPtr,
short *heightPtr )
{
short i;
Rect r;
PicHandle pic;
*widthPtr = 0;
*heightPtr = 0;
for ( i=0; i<numPICTs; i++ )
{
pic = GetPicture( basePICTid + i );
r = (**pic).picFrame;
if ( r.bottom - r.top > *heightPtr )
*heightPtr = r.bottom - r.top;
if ( r.right - r.left > *widthPtr )
*widthPtr = r.right - r.left;
}
}
/*********************************** GetNumPICTs */
void GetNumPICTs( MenuHandle menu,
short *baseIDPtr,
short *numPICTsPtr )
{
Handle longHandle;
long retrievedLong;
short menuID;
menuID = (**menu).menuID;
longHandle = GetResource( 'long', menuID );
retrievedLong = (*((long *)(*longHandle)));
*baseIDPtr = HiWord( retrievedLong );
*numPICTsPtr = LoWord( retrievedLong );
}